/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 学习.下.内部类;
/**
 * @description 可以把一个类A声明在另一个类B中 A是为B的内部类  B为外部类
 *    分类 成员内部类                            局部内部类
 *        与属性 方法等同级                      在方法 代码块 构造器内
 *        ①调用外部类结构                       会用到一个方法返回接口的实现类（这个实现类可以使局部内部类）
 *        ②可以有属性方法构造器 可以继承
 *          可以用final abstract修饰
 *   实例化成员内部类对象
 * @author 俊昭
 * @date 2022/4/8
*/
public class InnerClassTest {
    public static void main(String[] args) {
        Person a=new Person();
//        静态内部类的实例
        Person.Dogs d1 = new Person.Dogs();
        d1.show();
//        非静态内部类的实例
        Person.Bird p =new Person().new Bird();
        p.sing();

    }
}
class Person {
    public String name;
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
        System.out.println();
    }

    public void eat(){
        System.out.println("吃");
    }


    static class Dogs{// 成员内部类
        public void show(){
            System.out.println("汪汪");
//            eat();无法从 static 上下文引用非 static 方法 'eat()'
        }
    }
    final class Bird{// 成员内部类

//        static String name = "123";
        public void sing(){
            System.out.println("鸟唱歌");
//            Dogs s = new Dogs();
//            s.show();
//            Person.this.eat();

        }
    }
    public void method(){
        class A{// 局部内部类

        }
    }
    {
        class B{// 局部内部类

        }
    }
    public Person(){
        class C{// 局部内部类

        }
    }
}